package com.atguigu.spring.config;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

/**
 * 注意 1：一旦创建了 bean 的后置处理器，那么它就会对 IoC 容器中所有 bean 都生效
 * 注意 2：两个处理 bean 的方法都能够接收到当前要处理的 bean 对象，在方法体中可以做任何你想做的操作
 * 注意 3：两个处理 bean 的方法都有 Object 类型的返回值，那么这个返回值就是处理之后的 bean，甚至可以不是先前入参传入的 bean
 * 综上所述：使用 Bean 的后置处理器一定要非常慎重，确认编写的代码不会对项目产生不良影响
 *
 * 整体生命周期执行流程：
 * ★★★★★DemoController类创建对象了★★★★★
 * ★★★★★DemoController执行装配★★★★★
 * ☆☆☆☆☆[Bean后置处理器][初始化方法之前][beanName = getDemoController]☆☆☆☆☆
 * ★★★★★[初始化方法]基于@PostConstruct注解★★★★★
 * ★★★★★[初始化方法]基于InitializingBean接口★★★★★
 * ★★★★★[初始化方法]基于@Bean注解★★★★★
 * ☆☆☆☆☆[Bean后置处理器][初始化方法之后][beanName = getDemoController]☆☆☆☆☆
 * [正式使用]controller = com.atguigu.spring.controller.DemoController@7dcc91fd
 * ★★★★★[销毁方法]基于@PreDestroy注解★★★★★
 * ★★★★★[销毁方法]基于DisposableBean接口★★★★★
 * ★★★★★[销毁方法]基于@Bean注解★★★★★
 */
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(
            // 当前要处理的 bean 对象
            Object bean,

            // 当前 bean 对象的名称
            String beanName) throws BeansException {
        System.out.println("☆☆☆☆☆[Bean后置处理器][初始化方法之前][beanName = " + beanName + "]☆☆☆☆☆");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("☆☆☆☆☆[Bean后置处理器][初始化方法之后][beanName = " + beanName + "]☆☆☆☆☆");
        return bean;
    }
}
